package com.uniflow.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uniflow.entity.DataSyncLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 数据同步日志 Mapper 接口
 */
@Mapper
public interface DataSyncLogMapper extends BaseMapper<DataSyncLog> {
    
    /**
     * 分页查询数据同步日志
     */
    IPage<DataSyncLog> selectPageList(Page<DataSyncLog> page, @Param("syncId") String syncId,
                                      @Param("status") String status, @Param("triggerType") String triggerType,
                                      @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime,
                                      @Param("keyword") String keyword, @Param("tenantId") String tenantId);
    
    /**
     * 根据同步任务ID查询日志
     */
    List<DataSyncLog> selectBySyncId(@Param("syncId") String syncId, @Param("tenantId") String tenantId);
    
    /**
     * 根据批次号查询日志
     */
    List<DataSyncLog> selectByBatchNo(@Param("batchNo") String batchNo, @Param("tenantId") String tenantId);
    
    /**
     * 根据状态查询日志
     */
    List<DataSyncLog> selectByStatus(@Param("status") String status, @Param("tenantId") String tenantId);
    
    /**
     * 根据触发方式查询日志
     */
    List<DataSyncLog> selectByTriggerType(@Param("triggerType") String triggerType, @Param("tenantId") String tenantId);
    
    /**
     * 根据触发人查询日志
     */
    List<DataSyncLog> selectByTriggeredBy(@Param("triggeredBy") String triggeredBy, @Param("tenantId") String tenantId);
    
    /**
     * 查询正在运行的日志
     */
    List<DataSyncLog> selectRunningLogs(@Param("tenantId") String tenantId);
    
    /**
     * 查询失败的日志
     */
    List<DataSyncLog> selectFailedLogs(@Param("tenantId") String tenantId);
    
    /**
     * 查询最近的日志
     */
    List<DataSyncLog> selectRecentLogs(@Param("limit") Integer limit, @Param("tenantId") String tenantId);
    
    /**
     * 查询指定同步任务的最新日志
     */
    DataSyncLog selectLatestBySyncId(@Param("syncId") String syncId, @Param("tenantId") String tenantId);
    
    /**
     * 查询指定同步任务的最后成功日志
     */
    DataSyncLog selectLastSuccessBySyncId(@Param("syncId") String syncId, @Param("tenantId") String tenantId);
    
    /**
     * 查询指定同步任务的最后失败日志
     */
    DataSyncLog selectLastFailureBySyncId(@Param("syncId") String syncId, @Param("tenantId") String tenantId);
    
    /**
     * 查询长时间运行的日志
     */
    List<DataSyncLog> selectLongRunningLogs(@Param("minutes") Integer minutes, @Param("tenantId") String tenantId);
    
    /**
     * 查询执行时间超过阈值的日志
     */
    List<DataSyncLog> selectSlowLogs(@Param("durationThreshold") Long durationThreshold, @Param("tenantId") String tenantId);
    
    /**
     * 更新日志状态
     */
    int updateStatus(@Param("id") String id, @Param("status") String status, @Param("endTime") LocalDateTime endTime);
    
    /**
     * 更新执行进度
     */
    int updateProgress(@Param("id") String id, @Param("progress") Integer progress,
                       @Param("currentStep") String currentStep, @Param("stepProgress") Integer stepProgress);
    
    /**
     * 更新执行统计
     */
    int updateExecutionStats(@Param("id") String id, @Param("processedRecords") Long processedRecords,
                             @Param("successRecords") Long successRecords, @Param("failureRecords") Long failureRecords,
                             @Param("skippedRecords") Long skippedRecords, @Param("insertRecords") Long insertRecords,
                             @Param("updateRecords") Long updateRecords, @Param("deleteRecords") Long deleteRecords);
    
    /**
     * 更新错误信息
     */
    int updateError(@Param("id") String id, @Param("errorMessage") String errorMessage, @Param("errorStack") String errorStack);
    
    /**
     * 批量删除日志
     */
    int batchDelete(@Param("ids") List<String> ids);
    
    /**
     * 根据同步任务ID删除日志
     */
    int deleteBySyncId(@Param("syncId") String syncId);
    
    /**
     * 删除过期日志
     */
    int deleteExpiredLogs(@Param("expireTime") LocalDateTime expireTime, @Param("tenantId") String tenantId);
    
    /**
     * 清理指定状态的日志
     */
    int cleanupByStatus(@Param("status") String status, @Param("beforeTime") LocalDateTime beforeTime, @Param("tenantId") String tenantId);
    
    /**
     * 获取日志统计信息
     */
    Map<String, Object> getStatistics(@Param("tenantId") String tenantId);
    
    /**
     * 按状态统计日志数量
     */
    List<Map<String, Object>> getStatsByStatus(@Param("tenantId") String tenantId);
    
    /**
     * 按触发方式统计日志数量
     */
    List<Map<String, Object>> getStatsByTriggerType(@Param("tenantId") String tenantId);
    
    /**
     * 按同步任务统计日志数量
     */
    List<Map<String, Object>> getStatsBySyncId(@Param("tenantId") String tenantId);
    
    /**
     * 按触发人统计日志数量
     */
    List<Map<String, Object>> getStatsByTriggeredBy(@Param("tenantId") String tenantId);
    
    /**
     * 按时间统计日志数量
     */
    List<Map<String, Object>> getStatsByTime(@Param("startTime") LocalDateTime startTime,
                                              @Param("endTime") LocalDateTime endTime,
                                              @Param("timeUnit") String timeUnit,
                                              @Param("tenantId") String tenantId);
    
    /**
     * 按月份统计日志数量
     */
    List<Map<String, Object>> getStatsByMonth(@Param("year") Integer year, @Param("tenantId") String tenantId);
    
    /**
     * 获取执行成功率统计
     */
    Map<String, Object> getSuccessRateStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取平均执行时间统计
     */
    Map<String, Object> getAvgExecutionTimeStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取执行性能统计
     */
    Map<String, Object> getPerformanceStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取错误统计
     */
    Map<String, Object> getErrorStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取今日执行统计
     */
    Map<String, Object> getTodayStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取本周执行统计
     */
    Map<String, Object> getWeeklyStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取本月执行统计
     */
    Map<String, Object> getMonthlyStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取同步任务执行趋势
     */
    List<Map<String, Object>> getExecutionTrend(@Param("syncId") String syncId, @Param("days") Integer days, @Param("tenantId") String tenantId);
    
    /**
     * 获取同步任务性能趋势
     */
    List<Map<String, Object>> getPerformanceTrend(@Param("syncId") String syncId, @Param("days") Integer days, @Param("tenantId") String tenantId);
    
    /**
     * 获取同步任务错误趋势
     */
    List<Map<String, Object>> getErrorTrend(@Param("syncId") String syncId, @Param("days") Integer days, @Param("tenantId") String tenantId);
    
    /**
     * 获取热门同步任务
     */
    List<Map<String, Object>> getPopularSyncs(@Param("limit") Integer limit, @Param("tenantId") String tenantId);
    
    /**
     * 获取问题同步任务
     */
    List<Map<String, Object>> getProblematicSyncs(@Param("limit") Integer limit, @Param("tenantId") String tenantId);
    
    /**
     * 获取高性能同步任务
     */
    List<Map<String, Object>> getHighPerformanceSyncs(@Param("limit") Integer limit, @Param("tenantId") String tenantId);
    
    /**
     * 获取服务器执行统计
     */
    List<Map<String, Object>> getServerStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取资源使用统计
     */
    Map<String, Object> getResourceUsageStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取并发执行统计
     */
    Map<String, Object> getConcurrencyStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取数据量统计
     */
    Map<String, Object> getDataVolumeStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取执行队列统计
     */
    Map<String, Object> getQueueStats(@Param("tenantId") String tenantId);
    
    /**
     * 获取系统健康度统计
     */
    Map<String, Object> getHealthStats(@Param("tenantId") String tenantId);
    
    /**
     * 查询执行历史
     */
    List<DataSyncLog> selectExecutionHistory(@Param("syncId") String syncId, @Param("limit") Integer limit, @Param("tenantId") String tenantId);
    
    /**
     * 查询执行详情
     */
    DataSyncLog selectExecutionDetail(@Param("id") String id, @Param("tenantId") String tenantId);
    
    /**
     * 查询相关执行
     */
    List<DataSyncLog> selectRelatedExecutions(@Param("batchNo") String batchNo, @Param("tenantId") String tenantId);
    
    /**
     * 查询重试执行
     */
    List<DataSyncLog> selectRetryExecutions(@Param("originalId") String originalId, @Param("tenantId") String tenantId);
    
    /**
     * 查询依赖执行
     */
    List<DataSyncLog> selectDependentExecutions(@Param("syncId") String syncId, @Param("tenantId") String tenantId);
}